package modelado.soluciones;

import java.util.*;

import utiles.FactoriaDeColecciones;

import modelado.datos.elementos.Elemento;

public class SolucionConjuntoImpl implements SolucionConjunto {
	private Set<Elemento> conjunto;

	public SolucionConjuntoImpl() {
		conjunto = FactoriaDeColecciones.creaSet();
	}

	public SolucionConjuntoImpl(Solucion s1, Solucion s2) {
		conjunto = FactoriaDeColecciones.creaSet();
		SolucionConjunto s1c = (SolucionConjunto) s1;
		SolucionConjunto s2c = (SolucionConjunto) s2;
		conjunto.addAll(s1c.getElementosEnSolucion());
		conjunto.addAll(s2c.getElementosEnSolucion());
	}

	public Collection<Elemento> getElementosEnSolucion() {
		return conjunto;
	}

	public boolean isEmpty() {
		return conjunto.isEmpty();
	}

	public int size() {
		return conjunto.size();
	}

	public int hashCode() {
		return conjunto.hashCode();
	}

	public int compareTo(Solucion e) {
		int a = hashCode() - e.hashCode();
		return a;
	}

	public String toString() {
		String r = conjunto.toString();
		return r;
	}

	public void addElemento(Elemento e) {
		conjunto.add(e);
	}

	public void addElementos(Iterable<Elemento> e1) {
		for (Elemento e : e1) {
			addElemento(e);
		}

	}

	public void addSolucion(SolucionDiscreta s) {
		for (Elemento e : s.getElementosEnSolucion()) {
			addElemento(e);
		}
	}

	public Set<Elemento> getConjunto() {
		return conjunto;
	}

	public boolean equals(Object e) {
		boolean r = false;
		if (e instanceof SolucionConjunto) {
			SolucionConjunto e1 = (SolucionConjunto) e;
			r = getConjunto().equals(e1.getConjunto());
		}
		return r;
	}

	public Solucion clone() {
		SolucionConjunto s = new SolucionConjuntoImpl();
		Elemento ec;
		for (Elemento e : getConjunto()) {
			ec = e.clone();
			s.addElemento(ec);
		}
		return s;
	}

}
